/**************************************************************************//**
 * @item     CosyOS-III 例程（服务应用）
 * @file     coop_binary.c
 * @brief    协作_二值信号量
 * @details  通过二值信号量的{给予->获取}，实现任务的循环协作。
 * @note     适用于多个任意优先级任务的循环协作。
 * @author   迟凯峰
 * @version  V1.0.0
 * @date     2025.10.21
 ******************************************************************************/

/*-------------------------------------------*
 | 服务              | 描述                  |
 |-------------------+-----------------------|
 | uTakeBin(bin, ~0) | 任务中 获取二值信号量 |
 |-------------------+-----------------------|
 | uGiveBin(bin)     | 任务中 给予二值信号量 |
 *-------------------------------------------*/

#if 1 /* 编译开关 */

#include "CosyOS.H"

/* 二值信号量 */
uCreateBin(bin_1, true);  // 初值为true （任务中首次获取时可以立即成功获取而运行）
uCreateBin(bin_2, false); // 初值为false（任务中首次获取时不能立即成功获取而阻塞）
uCreateBin(bin_3, false); // 初值为false（任务中首次获取时不能立即成功获取而阻塞）

/* task_1 */
uCreateTask(task_1, 1, 384, 0, 0)
{
    while(1){
        if(uTakeBin(bin_1, ~0)){
            /* 协作处理事务 开始 */
            
            /* 协作处理事务 结束 */
            /* 同步至task_2 开始 */
            uGiveBin(bin_2);
            /* 同步至task_2 结束 */
        }
    }
}

/* task_2 */
uCreateTask(task_2, 1, 384, 0, 0)
{
    while(1){
        if(uTakeBin(bin_2, ~0)){
            /* 协作处理事务 开始 */
            
            /* 协作处理事务 结束 */
            /* 同步至task_3 开始 */
            uGiveBin(bin_3);
            /* 同步至task_3 结束 */
        }
    }
}

/* task_3 */
uCreateTask(task_3, 1, 384, 0, 0)
{
    while(1){
        if(uTakeBin(bin_3, ~0)){
            /* 协作处理事务 开始 */
            
            /* 协作处理事务 结束 */
            /* 同步至task_1 开始 */
            uGiveBin(bin_1);
            /* 同步至task_1 结束 */
        }
    }
}

/* 启动钩子 */
void start_hook(void)
{
    uStartTask_Ready(task_1); // 启动task_1，初始状态为就绪状态
    uStartTask_Ready(task_2); // 启动task_2，初始状态为就绪状态
    uStartTask_Ready(task_3); // 启动task_3，初始状态为就绪状态
}

#endif
